LINQ তে Set Operations হল এমন অপারেশনগুলো যা ডেটার মধ্যে ইউনিক বা সাধারণ উপাদান বের করতে, বা দুটি বা তার বেশি ডেটা সংগ্রহের মধ্যে সম্পর্ক নির্ধারণ করতে ব্যবহৃত হয়। এটি মূলত ডেটার মিল, পার্থক্য এবং ইউনিয়ন (union) বা ইন্টারসেকশন (intersection) সম্পর্কিত কাজগুলো করতে সহায়ক। LINQ তে Distinct, Union, Intersect, Except ইত্যাদি সেট অপারেশনগুলো পাওয়া যায়, যা ডেটাকে আরও কার্যকরভাবে পরিচালনা করতে ব্যবহৃত হয়।
Distinct অপারেশন ব্যবহার করে আপনি ডেটা সোর্স থেকে পুনরাবৃত্তি উপাদানগুলি সরিয়ে ফেলতে পারেন এবং শুধুমাত্র ইউনিক (unique) উপাদানগুলি নির্বাচন করতে পারেন।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 4, 5, 5, 6 };
// Distinct অপারেশন ব্যবহার করে ইউনিক সংখ্যাগুলো বের করা
var distinctNumbers = numbers.Distinct();
foreach (var num in distinctNumbers)
{
Console.WriteLine(num); // Output: 1, 2, 3, 4, 5, 6
}
এখানে Distinct ব্যবহার করে রিপিটেড সংখ্যাগুলো যেমন ৪ এবং ৫ সরিয়ে দিয়ে শুধুমাত্র ইউনিক (অপ্রতিরোধ্য) সংখ্যাগুলি ফেরত আসবে।
Union অপারেশন দুটি বা তার বেশি ডেটা সোর্সের মধ্যে ইউনিক উপাদানগুলো যোগ করে। যদি দুইটি লিস্টে একই উপাদান থাকে, তবে তা একবারই ফলস্বরূপ থাকবে। এটি মূলত দুইটি সংগ্রহের মিল তৈরি করার জন্য ব্যবহৃত হয়।
উদাহরণ:
List<int> numbers1 = new List<int> { 1, 2, 3, 4 };
List<int> numbers2 = new List<int> { 3, 4, 5, 6 };
// Union অপারেশন ব্যবহার করে দুটি লিস্টের ইউনিয়ন তৈরি করা
var unionResult = numbers1.Union(numbers2);
foreach (var num in unionResult)
{
Console.WriteLine(num); // Output: 1, 2, 3, 4, 5, 6
}
এখানে Union অপারেশনটি numbers1
এবং numbers2
লিস্টের মধ্যে মিলিত উপাদানগুলো বের করে, তবে রিপিটেড উপাদানগুলো শুধুমাত্র একবার থাকবে।
Intersect অপারেশন দুটি ডেটা সোর্সের মধ্যে সাধারণ উপাদান বের করতে ব্যবহৃত হয়। এটি দুটি সংগ্রহের মিল (intersection) তৈরি করে এবং কেবল সেই উপাদানগুলো ফেরত দেয় যা উভয় সংগ্রহে বিদ্যমান।
উদাহরণ:
List<int> numbers1 = new List<int> { 1, 2, 3, 4 };
List<int> numbers2 = new List<int> { 3, 4, 5, 6 };
// Intersect অপারেশন ব্যবহার করে দুটি লিস্টের ইন্টারসেকশন বের করা
var intersectResult = numbers1.Intersect(numbers2);
foreach (var num in intersectResult)
{
Console.WriteLine(num); // Output: 3, 4
}
এখানে Intersect অপারেশনটি numbers1
এবং numbers2
লিস্টের মধ্যে সাধারণ উপাদানগুলো বের করেছে, অর্থাৎ ৩ এবং ৪।
Except অপারেশন একটি লিস্টের উপাদান অন্য লিস্ট থেকে বাদ দেয়। এটি মূলত একটি সংগ্রহের থেকে অন্য সংগ্রহের উপাদান বাদ দিয়ে বাকি উপাদানগুলো প্রদান করে।
উদাহরণ:
List<int> numbers1 = new List<int> { 1, 2, 3, 4, 5 };
List<int> numbers2 = new List<int> { 4, 5, 6, 7 };
// Except অপারেশন ব্যবহার করে numbers2 থেকে numbers1 বাদ দেওয়া
var exceptResult = numbers1.Except(numbers2);
foreach (var num in exceptResult)
{
Console.WriteLine(num); // Output: 1, 2, 3
}
এখানে Except অপারেশনটি numbers1
থেকে numbers2
এর উপাদানগুলো বাদ দিয়ে শুধুমাত্র ১, ২, ৩ উপাদানগুলো ফিরে দিয়েছে।
LINQ তে Set Operations বিভিন্ন প্রকারের ডেটা কন্ট্রোল, যেমন ফিল্টারিং, গ্রুপিং, বা ইউনিক/কমন উপাদান নির্বাচন করতে সহায়ক। এগুলি আপনাকে ডেটার সম্পর্ক এবং মিল বের করতে সাহায্য করে। যদি আপনার ডেটা সোর্সে পুনরাবৃত্তি উপাদান থাকে, তবে Distinct, Union, Intersect, এবং Except এর মাধ্যমে সেগুলি সঠিকভাবে প্রক্রিয়া করা যেতে পারে।
LINQ এর Set Operations ডেটার মিল, পার্থক্য, এবং ইউনিয়ন সম্পর্কে কার্যকরী ধারণা প্রদান করে, এবং এটি ডেটার প্রয়োজনীয় অংশ নির্বাচন করতে সহায়ক। এগুলি মূলত সিস্টেমে ডেটা বিশ্লেষণ এবং প্রক্রিয়া করতে ব্যবহৃত হয়, যা ডেভেলপারদের আরও নমনীয়ভাবে কাজ করতে সাহায্য করে।
LINQ এ Distinct, Union, এবং Intersect মেথডগুলি আপনাকে বিভিন্ন সংগ্রহের মধ্যে ডুপ্লিকেট অপসারণ এবং সামঞ্জস্যপূর্ণ তথ্য খোঁজা করতে সাহায্য করে। এই তিনটি মেথড আপনার ডেটা ম্যানিপুলেশন বা সংগ্রহের বিভিন্ন প্রয়োজনে কার্যকরী হতে পারে।
Distinct
মেথডটি একটি সংগ্রহের মধ্যে ডুপ্লিকেট উপাদানগুলি অপসারণ করতে ব্যবহৃত হয়। এটি একটি নতুন সংগ্রহ তৈরি করে, যেখানে শুধুমাত্র ইউনিক (অদ্বিতীয়) উপাদান থাকবে।
List<int> numbers = new List<int> { 1, 2, 3, 3, 4, 5, 5, 6 };
// ডুপ্লিকেট অপসারণ
var distinctNumbers = numbers.Distinct();
foreach (var num in distinctNumbers)
{
Console.WriteLine(num); // Output: 1, 2, 3, 4, 5, 6
}
এখানে Distinct()
মেথডটি লিস্টের মধ্যে থাকা ডুপ্লিকেট সংখ্যা (যেমন 3 এবং 5) অপসারণ করে শুধুমাত্র ইউনিক সংখ্যা ফিরিয়ে দিয়েছে।
Union
মেথডটি দুটি সংগ্রহের মধ্যে অবিচ্ছিন্ন (distinct) উপাদান একত্রিত করতে ব্যবহৃত হয়। এটি দুটি সংগ্রহের একত্রিত (concatenate) উপাদানগুলো থেকে ডুপ্লিকেট অপসারণ করে একটি নতুন সংগ্রহ তৈরি করে।
List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 3, 4, 5, 6 };
// দুটি লিস্টের ইউনিক উপাদান একত্রিত করা
var unionList = list1.Union(list2);
foreach (var num in unionList)
{
Console.WriteLine(num); // Output: 1, 2, 3, 4, 5, 6
}
এখানে, Union
মেথড দুটি লিস্টের মধ্যে সাধারণ উপাদানগুলো (৩ এবং ৪) বাদ দিয়ে, সমস্ত ইউনিক উপাদানকে একত্রিত করে একটি নতুন সংগ্রহ তৈরি করেছে।
Intersect
মেথডটি দুটি সংগ্রহের মধ্যে যে উপাদানগুলি সাধারণ, অর্থাৎ উভয় সংগ্রহেই বিদ্যমান, তা বের করে। এটি দুটি সংগ্রহের সামঞ্জস্যপূর্ণ উপাদান রিটার্ন করে এবং ডুপ্লিকেটগুলো বাদ দেয়।
List<int> list1 = new List<int> { 1, 2, 3, 4 };
List<int> list2 = new List<int> { 3, 4, 5, 6 };
// দুটি লিস্টের সাধারণ (common) উপাদান খোঁজা
var intersectList = list1.Intersect(list2);
foreach (var num in intersectList)
{
Console.WriteLine(num); // Output: 3, 4
}
এখানে Intersect
মেথডটি দুটি লিস্টের মধ্যে যে উপাদানগুলো উভয়েই রয়েছে (৩ এবং ৪), তা একত্রিত করে রিটার্ন করেছে।
ধরা যাক, আমাদের একটি Employee
ক্লাস রয়েছে এবং আমরা একই নামের কর্মীদের অপসারণ করতে চাই।
public class Employee
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Employee> employees = new List<Employee>
{
new Employee { Name = "Alice", Age = 25 },
new Employee { Name = "Bob", Age = 30 },
new Employee { Name = "Alice", Age = 28 },
new Employee { Name = "Charlie", Age = 35 }
};
// Distinct - Name অনুযায়ী ইউনিক কর্মী নির্বাচন
var distinctEmployees = employees.Distinct().ToList();
foreach (var emp in distinctEmployees)
{
Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}
এখানে Distinct()
দ্বারা একই নামের কর্মী গুলি অপসারণ করা হবে।
List<Employee> list1 = new List<Employee>
{
new Employee { Name = "Alice", Age = 25 },
new Employee { Name = "Bob", Age = 30 }
};
List<Employee> list2 = new List<Employee>
{
new Employee { Name = "Bob", Age = 30 },
new Employee { Name = "Charlie", Age = 35 }
};
// দুটি লিস্টের ইউনিক কর্মী একত্রিত করা
var unionEmployees = list1.Union(list2, new EmployeeComparer()).ToList();
foreach (var emp in unionEmployees)
{
Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}
এখানে, EmployeeComparer
একটি custom comparer যা Name
এবং Age
প্রপার্টির উপর ভিত্তি করে কর্মীদের তুলনা করে।
List<Employee> list1 = new List<Employee>
{
new Employee { Name = "Alice", Age = 25 },
new Employee { Name = "Bob", Age = 30 }
};
List<Employee> list2 = new List<Employee>
{
new Employee { Name = "Bob", Age = 30 },
new Employee { Name = "Charlie", Age = 35 }
};
// দুটি লিস্টের সাধারণ (common) কর্মী খোঁজা
var intersectEmployees = list1.Intersect(list2, new EmployeeComparer()).ToList();
foreach (var emp in intersectEmployees)
{
Console.WriteLine($"Name: {emp.Name}, Age: {emp.Age}");
}
এখানে Intersect
মেথডটি Bob নামের কর্মীকে উভয় লিস্টের মধ্যে সাধারণ উপাদান হিসেবে নির্বাচন করবে।
এই তিনটি মেথডটি ডেটা ম্যানিপুলেশন এবং ফিল্টারিং এর ক্ষেত্রে খুবই কার্যকরী।
LINQ Except মেথড ব্যবহার করে একটি ডেটা সংগ্রহ থেকে অন্য একটি ডেটা সংগ্রহের উপাদানগুলো বাদ দিতে পারেন। এটি দুটি সংগ্রহের মধ্যে যেসব উপাদান প্রথম সংগ্রহে আছে কিন্তু দ্বিতীয় সংগ্রহে নেই, সেই উপাদানগুলো প্রদান করে। সহজভাবে বললে, Except মেথডটি দুটি সংগ্রহের পার্থক্য বের করে দেয়।
Except মেথড দুটি সংগ্রহের উপাদান তুলনা করে এবং প্রথম সংগ্রহের এমন উপাদানগুলোকেই নির্বাচন করে যেগুলি দ্বিতীয় সংগ্রহে নেই। এটি সাধারণত ডেটার তুলনা এবং ফিল্টারিং করতে ব্যবহৃত হয়।
IEnumerable<T> Except(IEnumerable<T> second);
এখানে:
T
: উপাদানের ধরন (যেমন, int, string, বা যে কোনো কাস্টম টাইপ)second
: দ্বিতীয় সংগ্রহ (যা প্রথম সংগ্রহের উপাদানগুলোর সঙ্গে তুলনা করা হয়)ধরা যাক, আপনার কাছে দুটি তালিকা রয়েছে, এবং আপনি চান যে প্রথম তালিকার এমন উপাদানগুলো বের করা হোক, যেগুলি দ্বিতীয় তালিকায় নেই।
List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
List<int> list2 = new List<int> { 3, 4, 5, 6, 7 };
// Except ব্যবহার করে list1 থেকে list2 এর উপাদান বাদ দেওয়া
var result = list1.Except(list2);
foreach (var item in result)
{
Console.WriteLine(item); // Output: 1, 2
}
এখানে Except মেথডটি list1
থেকে 3, 4, 5 বাদ দিয়ে 1, 2
উপাদানগুলো ফিরিয়ে দিয়েছে, কারণ এই উপাদানগুলো list2
তে নেই।
Except
সঠিকভাবে কাজ করবে না যতক্ষণ না আপনি সেই অবজেক্টের সমতা নির্ধারণ (equality comparison) সঠিকভাবে সেট না করেন। এর জন্য আপনাকে IEqualityComparer<T>
ইন্টারফেস ইমপ্লিমেন্ট করতে হবে।ধরা যাক, আপনার কাছে একটি কাস্টম ক্লাস Person
আছে এবং আপনি দুইটি List এর মধ্যে পার্থক্য বের করতে চান:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
var person = obj as Person;
return person != null && Name == person.Name && Age == person.Age;
}
public override int GetHashCode()
{
return Name.GetHashCode() ^ Age.GetHashCode();
}
}
List<Person> list1 = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
List<Person> list2 = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "David", Age = 40 }
};
// Except ব্যবহার করে list1 থেকে list2 এর Person বাদ দেওয়া
var result = list1.Except(list2);
foreach (var person in result)
{
Console.WriteLine($"{person.Name}, {person.Age}");
// Output: Bob, 25
// Charlie, 35
}
এখানে Equals এবং GetHashCode মেথডটি Person ক্লাসে কাস্টমাইজ করা হয়েছে যাতে Except সঠিকভাবে Person
অবজেক্টগুলির তুলনা করতে পারে।
LINQ এর Except মেথড দুটি সংগ্রহের মধ্যে যেসব উপাদান একত্রে থাকে না, শুধুমাত্র সেগুলিকে বের করে। এটি ডেটা ফিল্টার এবং তুলনা করার জন্য অত্যন্ত কার্যকরী, বিশেষ করে যখন আপনাকে দুটি সংগ্রহের পার্থক্য বের করতে হয়।
LINQ ব্যবহার করে ডুপ্লিকেট ডেটা ফিল্টার করা বা অপসারণ করা খুবই সহজ। এর জন্য Distinct() মেথডটি ব্যবহার করা হয়। এই মেথডটি একটি সংগ্রহের মধ্যে থেকে শুধুমাত্র ইউনিক (অব্যক্ত) মানগুলি ফিরিয়ে আনে, অর্থাৎ যেসব মান একাধিকবার রয়েছে, সেগুলো শুধুমাত্র একবার প্রদর্শিত হবে।
Distinct()
মেথড একটি সংগ্রহ বা সিকোয়েন্স থেকে ডুপ্লিকেট উপাদানগুলো সরিয়ে ফেলতে সাহায্য করে। এটি method syntax এর মাধ্যমে ব্যবহার করা হয়, যেমন:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 1, 2, 6, 7, 3 };
// Distinct() ব্যবহার করে ডুপ্লিকেট অপসারণ করা
var distinctNumbers = numbers.Distinct();
foreach (var number in distinctNumbers)
{
Console.WriteLine(number); // Output: 1, 2, 3, 4, 5, 6, 7
}
এখানে, Distinct()
মেথড ব্যবহার করে numbers
লিস্ট থেকে ডুপ্লিকেট সংখ্যা গুলো সরিয়ে দেয়া হয়েছে।
Query syntax ব্যবহার করে Distinct()
মেথড ব্যবহার করতে হলে আপনি distinct
কিওয়ার্ড ব্যবহার করবেন, যেমন:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 1, 2, 6, 7, 3 };
// Distinct() ব্যবহার করে ডুপ্লিকেট অপসারণ করা (Query Syntax)
var distinctNumbers = from num in numbers
select num;
foreach (var number in distinctNumbers.Distinct())
{
Console.WriteLine(number); // Output: 1, 2, 3, 4, 5, 6, 7
}
এখানে, distinct
কিওয়ার্ড ব্যবহার করে লিস্ট থেকে ডুপ্লিকেট মানগুলি সরিয়ে দেয়া হয়েছে।
যদি আপনার ডেটা একটি কাস্টম অবজেক্টের লিস্ট হয় (যেমন একটি Person
ক্লাস), এবং আপনি চান যে একাধিক কাস্টম অবজেক্টের মধ্যে যদি কোন প্রপার্টি বা ক্ষেত্রের মান সমান হয়, তবে তা ডুপ্লিকেট হিসেবে গণ্য হবে, তাহলে Distinct() ব্যবহারের জন্য IEqualityComparer ইন্টারফেসটি ব্যবহার করতে হয়।
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Person> people = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Charlie", Age = 35 }
};
// Custom Distinct (Name এবং Age এর ভিত্তিতে)
var distinctPeople = people.Distinct(new PersonComparer());
foreach (var person in distinctPeople)
{
Console.WriteLine($"{person.Name}, {person.Age}");
}
// Custom IEqualityComparer
public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (x == null || y == null)
return false;
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode() ^ obj.Age.GetHashCode();
}
}
এখানে:
PersonComparer
একটি কাস্টম IEqualityComparer ক্লাস যা Name এবং Age এর ভিত্তিতে দুইটি Person
অবজেক্টের সমানতা পরীক্ষা করে।Distinct()
মেথড এই কাস্টম কম্পেয়ারার ব্যবহার করে ডুপ্লিকেট Person
অবজেক্টগুলো সরিয়ে ফেলছে।আউটপুট:
Alice, 30
Bob, 25
Charlie, 35
এখানে, একই নাম এবং বয়সের দুটি Person
অবজেক্টকে ডুপ্লিকেট হিসেবে ধরা হয়েছে এবং শুধুমাত্র একবার প্রদর্শন করা হয়েছে।
Distinct()
মেথডটি শুধুমাত্র সাদামাটা (primitive) ধরনের ডেটার জন্য কাজ করে, যেমন int
, string
, float
ইত্যাদি।LINQ এর Distinct() মেথড ব্যবহার করে ডুপ্লিকেট ডেটা সহজে ফিল্টার করা সম্ভব। এটি List
, Array
, বা যে কোন আইটেমের সিকোয়েন্সের মধ্যে ডুপ্লিকেট উপাদান সরিয়ে ফেলতে সাহায্য করে। কাস্টম অবজেক্টের জন্য IEqualityComparer প্রয়োগের মাধ্যমে ডুপ্লিকেট চেক করা যায়।
common.read_more